/**
 * 音乐目录相关数据传输对象
 *
 * 定义了音乐目录模块中使用的各种数据传输对象，
 * 用于请求参数验证和响应数据格式化。
 */
import { IsString, IsOptional, IsNumber, IsArray } from 'class-validator';
import { Type } from 'class-transformer';

/**
 * 创建音乐目录的请求数据DTO
 *
 * 用于验证创建音乐目录时的请求参数
 */
export class CreateMusicDirectoryDto {
  /**
   * 目录名称
   * 必填字段，字符串类型
   */
  @IsString()
  name: string;

  /**
   * 目录描述
   * 可选字段，字符串类型
   */
  @IsOptional()
  @IsString()
  description?: string;
}

/**
 * 更新音乐目录的请求数据DTO
 *
 * 用于验证更新音乐目录时的请求参数
 */
export class UpdateMusicDirectoryDto {
  /**
   * 目录名称
   * 可选字段，字符串类型
   */
  @IsOptional()
  @IsString()
  name?: string;

  /**
   * 目录描述
   * 可选字段，字符串类型
   */
  @IsOptional()
  @IsString()
  description?: string;
}

/**
 * 音乐目录响应数据DTO
 *
 * 用于格式化返回给客户端的音乐目录数据
 */
export class MusicDirectoryResponseDto {
  /**
   * 目录唯一标识符
   */
  id: number;

  /**
   * 目录名称
   */
  name: string;

  /**
   * 目录描述
   */
  description?: string;

  /**
   * 目录所有者ID
   */
  ownerId: number;

  /**
   * 目录中歌曲数量
   */
  songCount: number;

  /**
   * 目录中播放列表数量
   */
  playlistCount: number;

  /**
   * 创建时间
   */
  createdAt: Date;

  /**
   * 更新时间
   */
  updatedAt: Date;
}

/**
 * 向目录添加歌曲的请求数据DTO
 *
 * 用于验证向音乐目录添加歌曲时的请求参数
 */
export class AddSongToDirectoryDto {
  /**
   * 要添加的歌曲ID数组
   * 必填字段，数字数组类型
   */
  @IsArray()
  @IsNumber({}, { each: true })
  songIds: number[];
}

/**
 * 向目录添加播放列表的请求数据DTO
 *
 * 用于验证向音乐目录添加播放列表时的请求参数
 */
export class AddPlaylistToDirectoryDto {
  /**
   * 要添加的播放列表ID数组
   * 必填字段，数字数组类型
   */
  @IsArray()
  @IsNumber({}, { each: true })
  playlistIds: number[];
}
